from django.shortcuts import render, redirect
from django.utils.deprecation import MiddlewareMixin
from web import models
from django.conf import settings
import datetime


class Tracer(object):

    def __init__(self):
        self.user = None
        self.price_policy = None


class AuthMiddleware(MiddlewareMixin):
    """
    登录认证的中间件
    """

    def process_request(self, request):

        request.tracer = Tracer()

        # 获取当前用户的session信息即当前用户的id赋值给user_id
        user_id = request.session.get('user_id', 0)

        # 根据session信息即用户id 在数据库中获取当前用户的对象user_object
        user_object = models.UserInfo.objects.filter(id=user_id).first()

        # 将当前用户对象user_object赋值给request.tracer.user
        request.tracer.user = user_object

        # 获取用户访问的url
        url = request.path_info

        # 判断此url是否在定义好的白名单中，若在，则允许访问，
        if url in settings.WHITE_REGEX_URL_LIST:
            return

        # 若不在，则判断登录与否
        if not request.tracer.user:
            return redirect('login')

        # 登录成功之后，获取当前登录用户最后一次的交易记录即最新的交易记录，即可获取其有效使用权限！
        # 注意此最新交易记录一定存在(因为每个用户注册时都默认设置为个人免费版的使用权限，即每个登录的用户在交易记录表中都有一条信息)
        new_transaction_object = models.Transaction.objects.filter(user=user_object, status=2).order_by('-id').first()

        # 判断当前用户的使用权限是否已过期
        current_datetime = datetime.datetime.now()
        # new_transaction_object.end_datetime 即当前用户会员权限的结束时间，注册登录成功之后即给用户个人免费版的使用权限，
        # 为其设置的交易记录中的结束时间是null，故不能与当前时间比较大小，所以要判断其结束时间存在与否，存在的前提下才可以与当前时间比较大小
        if new_transaction_object.end_datetime and new_transaction_object.end_datetime < current_datetime:
            # 如果结束时间存在，则用户一定有最近购买某个套餐的交易记录，后又加判定条件，如果这个套餐已过期；则又为其设置成个人免费版的使用权限
            new_transaction_object = models.Transaction.objects.filter(
                user=user_object, status=2, price_policy__category=1).first()

        # request.transaction = new_transaction_object  将 transaction交易记录对象赋值给 request.transaction
        # 如果用户是个人免费版的权限或者最近购买的套餐未过期，
        # 则将其拥有的使用权限 new_transaction_object.price_policy 封装到 request.tracer.price_policy 中
        # 以供后续做相应的判断！
        request.tracer.price_policy = new_transaction_object.price_policy

    def process_view(self, request, view, args, kwargs):

        # 判断URL是否是以manage开头，如果是则判断项目ID是否是我创建 or 参与
        if not request.path_info.startswith('/manage/'):
            return

        project_id = kwargs.get('project_id')
        # 是否是我创建的
        project_object = models.Project.objects.filter(creator=request.tracer.user, id=project_id).first()
        if project_object:
            # 是我创建的项目的话，我就让他通过
            request.tracer.project = project_object
            return

        # 是否是我参与的项目
        project_user_object = models.ProjectUser.objects.filter(user=request.tracer.user, project_id=project_id).first()
        if project_user_object:
            # 是我参与的项目
            request.tracer.project = project_user_object.project
            return

        return redirect('project_list')
